﻿<?php

require('connection.php');

class User{
	
	var $username = "";     //Brukernavn
	var $error 	  = "";    //Forbeholdt diverse feilmeldinger
	var $uid      = "-1"; //Brukerens id
	var $type     = "";  //Admin eller vanlig bruker
	
	function User($db)
	{
		global $_POST, $_SESSION;
		
		// Sjekker om $_POST['username']) er satt.
		if(isset($_POST['username']))
		{
		// Om hentes informasjon ut om brukeren som nettopp har logga seg inn!
			$password = md5($_POST['password']);
			$this->username = $_POST['username'];
			$sql = 'SELECT * FROM users WHERE username=:username AND password=:password';
			$sth = $db->prepare($sql);
			$sth->bindParam(':username', $this->username);
			$sth->bindParam(':password', $password);
			$sth->execute();
			if($row = $sth->fetch())
			{
				// Sjekker om du er blokkert eller ikke. Om du er blokker
				if($row['blocked']=='yes')
				{
					$this->error = "Administrator har blokkert deg!";
				}
				else
				{
					//setter klasse-variablene til å speile den brukeren som er logget inn.
					$_SESSION['uid'] = $row['id'];	
					$this->uid = $row['id'];
					$this->type = $row['type'];
				}
			}
			else
			{
				// Om innloggingen feilet, lagre denne beskjeden
				$this->error = "Feil brukernavn eller passord! Prøv igjen.";
			}
			$sth->closeCursor();
		}
		// Sjekker om $_GET['logout'] er satt.
		else if(isset($_GET['logout']))
		{
		// Om dette stemmer, fjerner vi session og redirecter deg til index.php
			unset($_SESSION['uid']);			
			header("Location: index.php");
		}
		// Sjekker om session er satt
		else if(isset($_SESSION['uid']))
		{
			// om den er satt så hentes all informasjon om brukeren å plasseres i klasse-variablene
			$this->uid = $_SESSION['uid'];
			$sql = 'SELECT * FROM users WHERE id=:id';
			$sth = $db->prepare($sql);
			$sth->bindParam(':id', $_SESSION['uid']);
			$sth->execute();
			$row = $sth->fetch();
			$this->username = $row['username'];	
			$this->type = $row['type'];
		}	
	}
	
	// Sjekker om du er pålogget
	function loggedOn()
	{
		if($this->uid > -1)
			return true;
		else
			return false;
	}
	
	// Henter brukernavnet ditt
	function getName()
	{
		if($this->loggedOn())
			return $this->username;
		else
			return null;
	}
	
	// henter id'en din
	function getId()
	{
		if($this->loggedOn())
			return $this->uid;
		else
			return null;
	}
	
	// Sjekker hvilket stilsett brukeren har valgt, og returnerer valget
	function getStyle($db)
	{		
			//Hvis vi ikke er logget inn
			if( $db == null || !$this->loggedOn()) return "style.css";
			
			$sql = 'SELECT * from users where id=:id';
			$sth = $db->prepare($sql);
			$id = $this->getId();
			$sth->bindParam(':id', $id);
			$sth->execute();
			$row = $sth->fetch();
			$stil = $row['stil'];
			
			if ($stil == null || $stil == "") return "style.css";//Hvis vi ikke fant noen stil i db
			return $stil;	//Returnerer stilen som er hentet fra db
	}
	
	// Skriver ut et login-form
	function getLoginForm()
	{
		if($this->loggedOn())
		{
			echo "<form id='logout' method='post' action='index.php?logout'>
      				<input type='hidden' name='logout' value='true' />
       				<button type='submit'>Logg av</button>
				   </form>
				   ";
		}
 	 	else
		{
   		    echo "<form id='login' method='post' action='{$_SERVER['REQUEST_URI']}'>
					<fieldset>
						<ol>
							<li><label for='username'>Brukernavn</label><input type='text' name='username' /></li>
							<li><label for='password'>Passord</label><input type='password' name='password' /></li>
						</ol>
							<button type='submit'>Logg inn</button>
					</fieldset>
				  </form>
					<a href='createuser.php' class='reg_btn'><span>Ikke bruker?<br />Registrer deg her!</span></a>";
		}	
	}
	
	// Sjekker om du er logget inn som admin
	function loggedOnAsAdmin () {
	  if ($this->loggedOn() && $this->type == 'admin')
		return true;
	  else 
		return false;
  	}
  
	// Sjekker om du er pålogget som bruker
  	function loggedOnAsUser () {
	  if ($this->loggedOn() && $this->type == 'user')
		return true;
	  else 
		return false;
 	 }
 	 
	 //Sjekker om du er innleggets eier
 	 function isPostOwner($db, $postid)
 	 {
		$sql = "SELECT * FROM post WHERE id =:postid";
		$sth = $db->prepare($sql);
		$sth->bindParam(':postid',$postid);       
		$sth->execute();
		$res = $sth->fetch();
		$sth->closeCursor();
		
		if ($res['uid'] == $this->getId())	//Innleggets eier kan slette
			return true;
		else
			return false;  	
 	 }
	
	// Viser error
	function showError()
	{
		echo $this->error;
	}

	// Registrerer en ny bruker
	function registrerUser($db, $uname, $pwd, $email, $imgfiles)
	{
		if ($uname == null || $uname == "") return false;

		// Sjekker om brukernavent finnes fra før
		// Kolonnen er unikt da, så dette blir litt dobbelt opp		
		$sql = "SELECT * FROM users WHERE username =:username";
		$sth = $db->prepare($sql);
		$sth->bindParam(':username',$uname);       
		$sth->execute();
		if ($sth->rowCount() != 0)
		{
		// lagrer feilbeskjeden
		$this->error = "brukernavnet er opptatt";
		return false;
				
		}
		// sjekker om du registrerte bruker med bilde eller ei
		if($imgfiles != null) {
			$user = new User($db);
			$newname = $user->copyImage($uname);
			
			// Fikk du flyttet bildet??
			if (!$newname)
				echo '<h1>Filen ble ikke flyttet!</h1>';
			
			$sql = 'INSERT INTO users (username, password, email, imgurl) VALUES (?, ?, ?, ?)';
			$sth = $db->prepare ($sql);
			$sth->execute (array ($uname, MD5($pwd), $email, $newname));
			$sth->closeCursor();
			$res = $db->query ('SELECT LAST_INSERT_ID() as id');
			$row = $res->fetch();
			$_SESSION['uid'] = $row['id'];
		} else {
			$sql = 'INSERT INTO users (username, password, email) VALUES (?, ?, ?)';
			$sth = $db->prepare ($sql);
			$sth->execute (array ($uname, MD5($pwd), $email));
			$sth->closeCursor();
			$res = $db->query ('SELECT LAST_INSERT_ID() as id');
			$row = $res->fetch();
			$_SESSION['uid'] = $row['id'];
		}
		
		return true;
	}
	
	// Funksjon for å kopiere bilde fra tmp-folder til der brukerbildene skal ligge
	function copyImage($uname)
	{
		// Angir maks filstørrelse
		define ("MAX_SIZE","6000"); 
		$newname = "";
		
		// Sjekker om en fil er lastet opp
		if($_FILES['image']['name']) {
			$filename = stripslashes($_FILES['image']['name']);
			// henter ut fil-typen
			$ext = $this->getExtension($filename);
			$ext = strtolower($ext);
			// sjekker om filen er et bilde
			if (($ext != "jpg") && ($ext != "jpeg") && ($ext != "png") && ($extension != "gif")) {
				echo '<h1>Ukjent filtype. Støtta filtyper er jpg, gif og png.</h1>';
			} else {
			$size = filesize($_FILES['image']['tmp_name']);
			}
			if ($size > MAX_SIZE*1024) {
				echo '<h1>Du har valgt et bilde med for stor filstørrelse</h1>';
			}
			
			// gir bildet samme navn som brukernavnet til brukeren
			$image_name =  $uname.'.'.$ext;
			$newname = "images/user/".$image_name;
			$copied = copy($_FILES['image']['tmp_name'], $newname);
			if (!$copied) {
				return ""; //'<h1>Filen ble ikke flyttet!</h1>';
			}
		}
		
		return $newname;		
	}
	
	// Lar deg redigere brukeren
	function editUserinfo($db, $password, $email, $imgfiles, $stil)
	{
		// hvis du sendte med et bilde, kjør copyImage-funksjonen.
		if(!$imgfiles == null) {
			$imagevariable = $this->copyImage($this->getName());
		}
					
		// sjekker om du er pålogget
		if($this->loggedOn())
		{	
			//$sql = 'UPDATE users SET password=:password, email=:email, image=:image WHERE id=:id';
			$sql = 'UPDATE users SET ';
			
			// sjekker hvilke felt du har endret
			if ($password) $sql .= 'password=:password, ';
			if ($email) $sql .= 'email=:email, ';
			if ($stil) $sql .= 'stil=:stil, ';
			if ($imagevariable) $sql .= 'imgurl=:imgurl';
			$sql = rtrim($sql, ', ');
			$sql .= ' WHERE id=:id';
			
			$sth = $db->prepare ($sql);
			
			if ($password) $sth->bindParam (':password', md5($password));
			if ($email) $sth->bindParam (':email', $email);
			if ($imagevariable) $sth->bindParam (':imgurl', $imagevariable);
			if ($stil) $sth->bindParam (':stil', $stil);
			
			$sth->bindParam (':id', $this->getId());
			$sth->execute ();
		}
	}
	
	// en funksjon for å finne fil-type. Her lot vi google inspirere oss! ;-)
	function getExtension($str) {
		$i = strrpos($str,".");
		if (!$i) { return ""; }
		$l = strlen($str) - $i;
		$ext = substr($str,$i+1,$l);
		return $ext;
	}
	
	/* 
	 *  Endrer størrelsen på bildet (i <img>-taggen)
	 *  slik at det blir en thumbnail som passer inn i sidebaren på siden..
	 */
	function imageResize($width, $height, $new) {
		if($width > $height) {
			$percent = ($new / $width);
		} else {
			$percent = ($new / $height);
		}
		
		$width = round($width * $percent);
		$height = round($height * $percent);
		
		return "width=\"$width\" height=\"$height\"";
	}
	
	/* 
	 * Sjekker om brukeren faktisk har lastet opp et bilde
	 * Om brukeren har det, blir den true, om ikke blir den false
	 */	
	function userGotImage($db) {
		$sql = 'SELECT * from users where id=:id';
		$sth = $db->prepare($sql);
		$sth->bindParam(':id', $_SESSION['uid']);
		$sth->execute();
		$row = $sth->fetch();
		$img = $row['imgurl'];
		if($img) {
			return true;
		} else {
			return false;
		}
	}
	
	/* 
	 *Om en bruker er logget på, og brukeren har et bilde,
	 * så vises bildet som brukeren har lastet opp.
	 */
	function showImage($db) {
		if($this->loggedOn() && $this->userGotImage($db)) {
			$sql = 'SELECT * from users where id=:id';
			$sth = $db->prepare($sql);
			$sth->bindParam(':id', $_SESSION['uid']);
			$sth->execute();
			$row = $sth->fetch();
			$img = $row['imgurl'];
		
			$imgsize = getimagesize($img);
			$newsize = $this->imageResize($imgsize[0], $imgsize[1], 250);
	
			echo "<a href='{$img}' target='_blank'><img class='usrimg' src='{$img}' {$newsize} /></a>";
		}
	}
	
	/*
	 * En funksjon som lager menyen når du er innlogga.
	 *
	 */
	
	function menu() {
		if ($this->loggedOn())		
			echo '
			<a href="newpost.php" id="new_post" class="right button" >Skriv nytt innlegg</a>
			<a href="editUser.php" class="right button">Rediger profil</a>
			<a href="index.php?privat" class="right button">Vis dine innlegg</a>
			';
		// legger til ekstra elementer om du er admin		
		if($this->loggedOnAsAdmin()) {
			echo '<a href="upassende.php" class="right button">Vis alt upassende</a>';
			echo '<a href="listusers.php" class="right button">Se alle brukere</a>';
		}
	}
	
	/* Lister opp brukere for admins */
		function listUsers($db)
		{
		if($this->loggedOnAsAdmin())
		{
		$sql = "SELECT id,username,email,type,blocked FROM users";
		$sth = $db->prepare($sql);
		$sth->execute();
		while($row = $sth->fetch())
		{
			$spam = $this->countSpamFromUser($db,$row['id']);
			if($row["type"]=="admin")
			{ 
				echo '<tr><td>'.$row["username"].'</td><td>'.$row["email"].'</td>
				<td><form method="post" action="listusers.php?changetype&id='.$row['id'].'">
				<select onchange="this.form.submit();" name="typechange"><option selected value="'.$row["type"].'">Admin</option>
				<option value="user">User</option></select></form>
				</td><td>'.$spam.'</td>
				</tr>';
			}
			else
			{
				echo '<tr><td>'.$row["username"].'</td><td>'.$row["email"].'</td><td>
				<form method="post" action="listusers.php?changetype&id='.$row['id'].'">
				<select onchange="this.form.submit()" name="typechange">
				<option selected value="'.$row["type"].'">User</option>
				<option value="admin">Admin</option></select></form></td><td>'.$spam.'</td>
				<td>'.$row['blocked'].'</td><td><a href="listusers.php?blokker&id='.$row['id'].'">Blokker</a></td>
				<td><a href="listusers.php?avblokker&id='.$row['id'].'">Avblokker</a></td></tr>';
			}
		}
		}
		else
		{
			$this->error = "Du må være pålogget for å utføre handlingen";
		}
	}
	
	
	/* Lar en admin legge til andre brukere */
	function changeType($db,$id)
	{
		if($this->loggedOnAsAdmin())
		{
		$type = $_POST['typechange'];
		$sql = "UPDATE users SET type = :type WHERE id = :id";
		$sth = $db->prepare($sql);
		$sth->bindParam(':type',$type);
		$sth->bindParam(':id',$id);
		$sth->execute();
		}
		else
		{
			$this->error = "Du må være pålogget for å utføre handlingen";
		}
	}
	
	/* Finner hvor mange innlegg som er merket som spam */
	function countSpamFromUser($db, $userid)
		{
			$sql = "SELECT * FROM post WHERE uid = :uid AND spam = 'yes'";
			$sth = $db->prepare($sql);
			$sth->bindParam(':uid',$userid);
			$sth->execute();
			$spam = $sth->rowCount();
			return $spam;
		}
		
		//Admin kan blokke bruker
	function blockUser($db,$id)
	{
		if($this->loggedOnAsAdmin())
		{
			//$id = $_GET['id'];
			$sql = "UPDATE users SET blocked = 'yes' WHERE id = :id";
			$sth = $db->prepare($sql);
			$sth->bindParam(':id',$id);
			$sth->execute();			
		}
		else
		{
			echo $this->error = "Du må være pålogget for å utføre handlingen";
		}
		
	}
		//unblocke bruker
	function unblockUser($db,$id)
	{
		if($this->loggedOnAsAdmin())
		{
			//$id = $_GET['id'];
			$sql = "UPDATE users SET blocked = 'no' WHERE id = :id";
			$sth = $db->prepare($sql);
			$sth->bindParam(':id',$id);
			$sth->execute();			
		}
		else
		{
			echo $this->error = "Du må være pålogget for å utføre handlingen";
		}	
	}
	
	/*
	 * Lager en liste over brukere som er registrert.
	 * Her burde det vært en sjekk på om brukeren faktisk har skrevet et innlegg!!
	 * 
	 */
	function listBlogUsers($db) {
		$sql = "SELECT * FROM users ORDER BY username";
		$sth = $db->prepare($sql);
		$sth->execute();
		echo "<ul>";
		while($row = $sth->fetch()) {
			echo "<li> <a href='index.php?userid={$row['id']}'>{$row['username']}</a></li>";
		}
		echo "</ul>";
	}

}
$user = new User($db);

?>